"""
多态介绍“
    概述：
        多态指的是同一个事物在不同环境下表现出来不同状态/形态

        Python中多态指的是 同一个函数，因为引用接收不同的对象，函数达到不同的效果

    实现条件：
        1. 需要有继承关系
        2. 要有方法的重写
        3. 要有父类的引用指向子类的对象 (向上造型)
"""
import random
import time
from typing import List


# 1. 定义一个动物类
class Animal:

    def speak(self):
        # print('我是动物，我会叫')
        pass

# 2. 定义一个狗类
class Dog(Animal):

    def speak(self):
        print('狗：汪汪汪')

class Cat(Animal):
    def speak(self):
        print('猫：喵喵喵')

class Tiger(Animal):
    def speak(self):
        print('老虎：嗷喔嗷喔嗷喔')


if __name__ == '__main__':
    # # 创建对象
    # d1 = Dog()
    #
    # c1 = Cat()
    #
    # t1 = Tiger()
    #
    #
    #
    # # 父类的引用指向子类的对象
    # d2:Animal = Dog()  # 狗是动物
    # c2:Animal = Cat()  # 猫是动物
    #
    # d2.speak()
    #
    #
    # a:int = 10


    # 创建动物类
    # d1 = Dog()
    # d2 = Dog()
    # d3 = Dog()
    #
    # c1 = Cat()
    # c2 = Cat()
    # c3 = Cat()
    #
    # t1 = Tiger()
    # t2 = Tiger()
    # t3 = Tiger()

    # 创建一个元素都是Animal类型（或者其子类型）的列表 ans
    # ans:List[Animal] = [t1,c1,c2,t2,d1,d3,d2,t3,c3]

    # for an in ans:
    #     an.speak()

    ans: List[Animal] = []

    while True:
        num = random.randint(1,10)
        if num <= 3:
            ans.append(Cat())
        if 3 < num <= 6:
            ans.append(Dog())
        if 6 < num <= 10:
            ans.append(Tiger())

        for an in ans:
            time.sleep(1) # 时间间隔1秒
            an.speak()

